/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.kwikMart.Controller;

import com.kwikMart.accesData.DetallePedido;
import com.kwikMart.accesData.MedioPago;
import com.kwikMart.accesData.Pedido;
import com.kwikMart.accesData.Producto;
import com.kwikMart.business.ParametricasEJBLocal;
import com.kwikMart.business.PedidoEJBLocal;
import com.kwikMart.business.ProductoEJBLocal;
import com.kwikMart.utils.OperationResult;
import java.io.Serializable;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;

/**
 *
 * @author WIL
 */
@ManagedBean
@SessionScoped
public class ListadoProductosBean implements Serializable {

    @EJB
    private PedidoEJBLocal pedidoEJB;

    @EJB
    private ParametricasEJBLocal parametricasEJB;

    @EJB
    private ProductoEJBLocal productoEJB;

    private final int TIPO_PRODUCTO_CARNE = 1;
    private final int TIPO_PRODUCTO_FRUTA_VERDURA = 2;
    private final int TIPO_PRODUCTO_BEBIDAS = 3;
    private double totalPrecioProductos;
    private int totalcantidadProductos;

    private int idCategoria = TIPO_PRODUCTO_CARNE;
    private List<Producto> listaProductosCategoria;
    private int spinner;
    private List<DetallePedido> listaDetallepedido = new ArrayList<DetallePedido>();
    private String nombreCategoria = "";

    private Producto currentProducto;
    private Pedido pedidoUsuario;
    private OperationResult resultado;

    public ListadoProductosBean() {
    }

    @PostConstruct
    public void iniciarBean() {
        llenarListaProducto();
        pedidoUsuario = new Pedido();
        resultado = new OperationResult(false);
        this.nombreCategoria = "Carnes";
    }

    public List<MedioPago> getListaMedioPago() {
        return parametricasEJB.getListMedioPago();
    }

    public double getTotalPrecioProductos() {
        return totalPrecioProductos;
    }

    public void setTotalPrecioProductos(double totalPrecioProductos) {
        this.totalPrecioProductos = totalPrecioProductos;
    }

    public int getTotalcantidadProductos() {
        return totalcantidadProductos;
    }

    public void setTotalcantidadProductos(int totalcantidadProductos) {
        this.totalcantidadProductos = totalcantidadProductos;
    }

    public void settearSpinner(int setSpinner) {
        this.spinner = setSpinner;
    }

    public List<DetallePedido> getListaDetallepedido() {
        return listaDetallepedido;
    }

    public void setListaDetallepedido(List<DetallePedido> listaDetallepedido) {
        this.listaDetallepedido = listaDetallepedido;
    }

    private void llenarListaProducto() {
        listaProductosCategoria = productoEJB.getListaProductos(this.idCategoria);

    }

    public String getNombreCategoria() {
        return nombreCategoria;
    }

    public void setNombreCategoria(String nombreCategoria) {
        this.nombreCategoria = nombreCategoria;
    }

    public int getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(int idCategoria) {
        this.idCategoria = idCategoria;
    }

    public Pedido getPedidoUsuario() {
        return pedidoUsuario;
    }

    public void setPedidoUsuario(Pedido pedidoUsuario) {
        this.pedidoUsuario = pedidoUsuario;
    }

    public OperationResult getResultado() {
        return resultado;
    }

    public void setResultado(OperationResult resultado) {
        this.resultado = resultado;
    }

    public int getSpinner() {
        return spinner;
    }

    public void setSpinner(int spinner) {
        this.spinner = spinner;
    }

    public int getTIPO_PRODUCTO_CARNE() {
        return TIPO_PRODUCTO_CARNE;
    }

    public int getTIPO_PRODUCTO_FRUTA_VERDURA() {
        return TIPO_PRODUCTO_FRUTA_VERDURA;
    }

    public int getTIPO_PRODUCTO_BEBIDAS() {
        return TIPO_PRODUCTO_BEBIDAS;
    }

    public List<Producto> getListaProductosCategoria() {
        return listaProductosCategoria;
    }

    public void setListaProductosCategoria(List<Producto> listaProductosCategoria) {
        this.listaProductosCategoria = listaProductosCategoria;
    }

    public Producto getCurrentProducto() {
        return currentProducto;
    }

    public void setCurrentProducto(Producto currentProducto) {
        this.currentProducto = currentProducto;
    }

    public String cambioPaginaProducto(int tipoProducto) {
        String url = "ListadoProductos.xhtml";
        if (tipoProducto == TIPO_PRODUCTO_CARNE) {
            this.idCategoria = tipoProducto;
            this.nombreCategoria = "Carnes";
        } else if (tipoProducto == TIPO_PRODUCTO_FRUTA_VERDURA) {
            this.nombreCategoria = "Frutas y Verduras";
            this.idCategoria = tipoProducto;
        } else if (tipoProducto == TIPO_PRODUCTO_BEBIDAS) {
            this.nombreCategoria = "Bebidas";
            this.idCategoria = tipoProducto;
        }
        llenarListaProducto();
        return url;
    }

    public void agregarProducto(Producto newProducto) {

        DetallePedido item = new DetallePedido();

        int index = -1;
        int posicion = 0;
        for (DetallePedido i : listaDetallepedido) {
            if (i.getIdProducto().getIdProducto() == newProducto.getIdProducto()) {
                index = posicion;
                break;
            }
            posicion++;
        }
        if (index > -1) {
            DetallePedido aux = listaDetallepedido.get(index);
            aux.setCantidad(aux.getCantidad() + newProducto.getUnidadesPedidas());
            listaDetallepedido.set(index, aux);
        } else {
            item.setCantidad(newProducto.getUnidadesPedidas());
            item.setCosto(newProducto.getCostoUnitario());
            item.setIdProducto(newProducto);
            listaDetallepedido.add(item);
        }
        totalizarCantidadProductos();
        totalizarPrecioproductos();
        this.spinner = 0;
    }

    public void iniciarBeanCompleto() {
        this.listaDetallepedido = new ArrayList<DetallePedido>();
        this.totalPrecioProductos = 0;
        this.totalcantidadProductos = 0;
        this.pedidoUsuario = new Pedido();
    }

    public void totalizarPrecioproductos() {
        this.totalPrecioProductos = productoEJB.totalizarPedido(this.listaDetallepedido);
        
        //this.totalPrecioProductos = sumatotalprod;
    }

    public void totalizarCantidadProductos() {
        int totalproductos = 0;
        for (DetallePedido i : this.listaDetallepedido) {
            totalproductos += i.getCantidad();
        }
        this.totalcantidadProductos = totalproductos;
    }

    private Pedido pedidoRealizadoOk;

    public Pedido getPedidoRealizadoOk() {
        return pedidoRealizadoOk;
    }

    public void setPedidoRealizadoOk(Pedido pedidoRealizadoOk) {
        this.pedidoRealizadoOk = pedidoRealizadoOk;
    }

    public void realizarPedido(sessionBean sesionClienteBean) {
        double totalCompra = getTotalPrecioProductos();
        resultado = pedidoEJB.crearPedido(pedidoUsuario, getListaDetallepedido(), sesionClienteBean.getClienteSesion(), totalCompra);
        if (resultado.isOk()) {
            this.pedidoRealizadoOk = (Pedido) resultado.getAditionalData();
            iniciarBeanCompleto();
        }
    }

    public String eliminarProductoList(Producto currentProducto) {

        int index = -1;
        int posicion = 0;

        for (DetallePedido i : listaDetallepedido) {
            if (i.getIdProducto().getIdProducto() == currentProducto.getIdProducto()) {
                index = posicion;
                break;
            }
            posicion++;
        }
        listaDetallepedido.remove(index);
        totalizarCantidadProductos();
        totalizarPrecioproductos();

        System.out.println("salio");
        return "RegistrarPedido";
    }
}
